STM32入门学习之

您所在的位置:网站首页 cpu configuration怎么设置 STM32入门学习之

STM32入门学习之

2024-06-29 13:17| 来源: 网络整理| 查看: 265

上来就是systick定时器,因为GPIO等的基础操作过于简单,网上资料太多了。 这里讨论的是基于STM32F10x 的基于 V3.5.0库的库函数配置方法。       Systick又叫系统嘀答定时器,是一个24位的硬件定时器。嵌入式操作系统常有一个类似“心跳”的定时器,来分配时间片,实现宏观上的多任务。 其实,操作系统的多任务,在微观上,CPU对多任务的管理是分时的。每个任务都给一定的时间片,就是把时间分成N个等份,优先级高或是 重要的任务多占几个时间片,优先级低的或是不重要的任务就少占几个时间片。大部分嵌入式操作系统基于时间片的。如ucos。        那基于STM32F10x V3.5.0库如何操作Systick定时器呢。 首先:STM32 的内核库已经提供了这个功能。只要配置SysTick_Config()即可实现。 看下面的程序段。 /* * 函数名:SysTick_Init * 描述         :启动系统滴答定时器 SysTick * 输入  : 无 * 输出  :无 * 调用  : 外部调用 */ void SysTick_Init(void) {         if(SysTick_Config(SystemCoreClock/1000))         //1ms定时器         {                 while(1);         }         //SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                         //若无法启动则关闭 }         SysTick_Config的参数,其实就是一个时钟次数,叫systick重装定时器的值。意思就是我要多少个1/fosc 时间后中断一下。       根据学过的物理中的时间与频率的公式:fosc=1/T   T=1/fosc ,fosc为系统的频率。 如果STM32时钟频率为:72MHz,每次的时间为:T=1/72MHz。1秒钟为:1/(每次的时间)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000。       反过来讲。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定时为1ms。 如果需要1S则,可以通一设置一个全局变量,然后定初值得为1000,这样,每个systick中断一次,这个全局变量减1,减到0,即systick中断1000次,时间 为:1ms*1000=1S。从而实现1S的定时。       因为SysTick定时器是:24位的,最大定时时间为:2的24次方*(1/72MHz)的时间,这里系统频率为:72MHz的情况下。       如何使用这个Systick用于程序设计上的延时或是定时作用呢? 如下: __IO uint32_t TimingDelay; 定义一个全局变量,注意类型为 volatile的。

volatile的作用: 作为指令关键字,确保本条指令不会因为编译器的优化而省略,且要求每次直接读值.然后定义一个延时或是定时函数:

/* * 函数名:Delay_ms * 描述         :ms延时程序,1ms为一个单位 * 输入  : - nTime * 输出  :无 * 示例  : Delay_ms(1) 实现的延时为:1*ms=1ms * 调用  :外部调用 */ void Delay_ms(uint16_t nTime) {         TimingDelay = nTime;         //使能系统滴答定时器         while(TimingDelay !=0); }       还要在系统的中断函数文件:stm32f10x_it.c/h里面,修改系统自带的systick函数。这个函数要么没有声明或是为空操作。这里加入 定时延时里的处理。       即中断后,全局变量做个--处理即可。       在::stm32f10x_it.c里修改如下: 添加外部的声明: extern __IO uint32_t TimingDelay;       修改这个函数: SysTick_Handler,这是系统的关于SysTick_Handler的中断服务程序名, 在启动文件里如:startup_stm32f10x_hd.s   有它的定义的名字。不要弄错了。否则无法中断处理。 /**   * @brief  This function handles SysTick Handler.   * @param  None   * @retval None   */ void SysTick_Handler(void) { if (TimingDelay != 0x00)         {                    TimingDelay--;          } }       以上,即定义配置好了Systick定时器。如何使用呢? 很简单。         Delay_ms(500);  即为延时500ms。        当然,使用前,请先初始化: SysTick_Init();        否则无法使用并影响后续的程序运行,这个很重要,就像打开了串口中断,你不清标志位,也同样在接收字符后,CPU中断在那里,而不能继续执行!。使用外设功能,需要初始化! 以上基本讲完了。主要是加入了自己的理解。 以下为搜索的一些其他理解。 SysTick_Config(SystemFrequency / 10)   函数的形参就是systick重装定时器的值。

systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。

SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。 SysTick的重装寄存器决定了定时器频率。 若SysTick的时钟源是72M,   SystemFrequency = 72000000Hz 所以 SysTick_Config(SystemFrequency / 1000); 就是1ms时基。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3